package com.neuedu.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.neuedu.bean.User;
import com.neuedu.dao.IUser;
import com.neuedu.dao.imp.UserImpl;
/**
 * UserServlet实现Servlet的功能，继承HttpServlelt
 * HttpServlet  所在包：javax.servlet.http.HttpServlet
 * 
 * 
 * 执行：输入的servlet的url
 * 
 * 
 * *.user:扩展名相同，* ，代表任意
 * user:自定义
 *  常用.do
 *  
 * @author Administrator
 *
 */
@WebServlet("*.user")
public class UserServlet extends HttpServlet {
	
	private IUser userdao=new UserImpl();
			

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 通过service，实现doGet或者doPost的调用，同时传入HttpServletRequest,HttpServletResponse
	 * HttpServletRequest :接收客户端请求的数据
	 * HttpServletResponse：响应数据给客户端（浏览器）--应答
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	      //方法：getRequestURI ：提取的  /javaweb0815/kkkkkk.user
		  String uri=req.getRequestURI();
		/*  System.out.println(uri);*/
		//提取网页名
		  String path=uri.substring(uri.lastIndexOf("/")+1, uri.indexOf("."));
		 /* System.out.println(path);*/
		  //匹配，当path和“list”相匹配的时候，调用list方法
		 //删除的第一个：调用delete方法
		  
		  //post传值，过来是乱码，在此处添加request对象的编码形式
		 /* req.setCharacterEncoding("utf-8");*/
		 
		  /*ServletContext context=this.getServletContext();*/
		 /* ServletContext context=this.getServletConfig().getServletContext();
		  System.out.println("servlet"+context.getInitParameter("charset"));*/
		   if("list".equals(path)) {
		       list(req,resp);
		   }else if("add".equals(path)) {
			   add(req, resp);
		   }else if("delete".equals(path)) {
			   delete(req, resp);
		   }else if("find".equals(path)) {
			   find(req, resp);
		   }else if("update".equals(path)) {
			   update(req, resp);
		   }else if("login".equals(path)) {
			 login(req, resp);   
		   }
		
		
	}
	/**
	 * 登录设置
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void login(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
	   //1：提取页面中的数据
		String uname=req.getParameter("username");
		String upwd=req.getParameter("userpwd");
		
		
		//2:和数据库中的数据匹配
		  User user=userdao.checkByNameandPassword(uname, upwd);
		  boolean flag=true;
		  if(user==null) {
			  flag=false;
		  }
		//3:true --list.user
		  //创建session
		 HttpSession session= req.getSession();
		  
		if(flag) {
			session.setAttribute("username", user.getUname());
			resp.sendRedirect("list.user");
		}else {
			//false--login.jsp
			
			resp.sendRedirect("login.jsp");
		}
		
		
	}
	
	/***
	 *  修改：1：找出这条记录 --find --根据id
	 *        如何实现从list.jsp页面提取一条记录放到update.jsp
               1.1 list.jsp 中点击修改按钮--调用servlet中find方法，找到这条记录，
               1.2 把这条记录的信息通过request对象中setAttribute方法，请求转发得方式，连接update.jsp页面
               1.3 把这条记录的信息在update.jsp中显式
	 *     2：这条记录的修改--update --旧id，其他是新值
	 */
	protected void find(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		/*System.out.println("查找这条记录");*/
		//1.1.1:提取uid
		String id=req.getParameter("uid");
		
		//1.1.2功能实现
		//1.1.3功能调用--提取这条记录
		User user=  userdao.find(Integer.parseInt(id));
		System.out.println(user);
		
		
		//1.2.1 request传值
		req.setAttribute("user", user);
		//1.2.2请求转发
		req.getRequestDispatcher("update.jsp").forward(req, resp);
		
	}
	protected void update(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
        //2.1提取数据
		String uname=req.getParameter("username");
				
		String upwd=req.getParameter("userpwd");
		String uaddress=req.getParameter("useraddress");
		String uid=req.getParameter("uid");
		//2.2 功能实现
		//2.3调用功能
		User user=new User();
		user.setUid(Integer.parseInt(uid));
		user.setUname(uname);
		user.setUpwd(upwd);
		user.setUaddress(uaddress);
		
		int i=userdao.update(user);
		if(i==-1) {
			System.out.println("修改不成功");
		}else {
			resp.sendRedirect("list.user");
			/*System.out.println("删除成功");*/
		}
	}
	
	/**
	 * 删除功能，有servlet来完成
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void delete(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		/*System.out.println("删除");*/
		//删除第二步：实现删除的功能
		//2.1获取删除id的值,req.getParameter中的参数是delete的传入的name值，得到是value，如1,12
		String id=req.getParameter("uid");
		
		//2.2具体功能在IUser中实现
		
		//2.3调用功能
		//String---》int
		int i=userdao.delete(Integer.parseInt(id));
		if(i==-1) {
			System.out.println("删除不成功");
		}else {
			resp.sendRedirect("list.user");
			/*System.out.println("删除成功");*/
		}
		
	}
	
	
	
	/**
	 *  增加数据
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	
	protected void add(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		/*System.out.println("实现添加的功能");*/
		//提取网页数据：
		//一个name，一个value
		//根据的(网页中元素（标签）的name属性值)name的值  ,使用req.getParameter方法，传入的value值，
		//value值的类型都是String
		/*req.setCharacterEncoding("utf-8");*/
		
		String uname=req.getParameter("username");
		
		/*System.out.println(uname);*/
		
		String upwd=req.getParameter("userpwd");
		String uaddress=req.getParameter("useraddress");
		
		//测试请求的数据是否是乱码--需要转换
		/*System.out.println(uname);*/
		
		
		
		
		
		  //传入的name一个，value多个
		/*  String[] honny= req.getParameterValues("userhonny");
		  for(int i=0;honny!=null&&i<honny.length;i++) {
			  System.out.println(honny[i]);
		  }*/
		/*System.out.println(uname+"  "+upwd+"  "+uaddress);*/
		//形成对象
		User user=new User();
		user.setUname(uname);
		user.setUpwd(upwd);
		user.setUaddress(uaddress);
		//调用方法
		int i=userdao.add(user);
		
		if(i==-1) {
			System.out.println("失败");
		}else {
			/*System.out.println("成功");*/
			//回到list界面--重定向--resp.sendRedirect
			resp.sendRedirect("list.user");
			
		}
		
	}
	
	/**
	 *  显式数据
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	//使用方法把list的功能封装。方法声明：doGet、doPost的修饰符、返回类型，参数列表，异常相同，方法名为自定义。
	protected void list(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		/**
		 * 实现从数据库中提取数据，传入到网页上
		 */
		
		
		//1：从数据库中提取数据
		List<User> listusers=userdao.selectAll();
		
		//2: 数据传入到网页
		//2.1：赋值，通过req赋值 ---在jsp中九大内置对象----request
		//req调用setAttribute方法，第一个参数：名（name），第二个参数：值（value）
		//name设置：自定义
		//value：数据库中提取的数据变量
		 req.setAttribute("listusers", listusers);
		 
		 //2.2：请求转发
		 //使用请求转发得方式把，req的内容传入到页面上
		 //生成RequestDispatcher对象，用于存放资源
		 RequestDispatcher rd=req.getRequestDispatcher("list.jsp");
		 //把当前请求传入另一个资源页面(servlet\html\jsp等)
		 // forword参数不是自己定义的，doGet\doPost的参数
		 rd.forward(req, resp);
	}

}
